package ru.mirent.libs.matcher;

import ru.mirent.utils.RegexpMatcher;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * Возврат значения соответствующее элементу из списка регулярных выражений.
 * В списке классо содержится соответствие регулярных выражений и названий, принадлежащих им.
 * Поступающий текст проверяется по списку всех регулярных выражений и в случае истинности одного из регулярных
 * выражений возвращается название для него.
 * В тесте этот пример продемонстрирован на примере URL, но его возможно применить в любой аналогичной ситуаци.
 */
public class ListMatcher implements Function<String, String> {
    /**
     * Ключ - регулярное выражение, значение - текст
     */
    private Map<String, String> mapRegexpAndName;

    /**
     * Создать обработчик списка регулярных выражений.
     * Для соблюдения порядка добавления элементов используется LinkedHashMap.
     * @param mapRegexpAndName список регулярных выражений
     */
    public ListMatcher(Map<String, String> mapRegexpAndName) {
        if (!(mapRegexpAndName instanceof LinkedHashMap)) {
            throw new RuntimeException(String.format("Ожидаемый тип данных 'LinkedHashMap', фактический: %s",
                            mapRegexpAndName.getClass().getSimpleName()));
        }
        this.mapRegexpAndName = mapRegexpAndName;
    }

    public ListMatcher() {
        this(new LinkedHashMap<>());
    }

    @Override
    public String apply(String text) {
        RegexpMatcher regexpMatcher = new RegexpMatcher();
        for (Map.Entry<String, String> entry: mapRegexpAndName.entrySet()) {
            if (regexpMatcher.apply(text, entry.getKey())) {
                return entry.getValue();
            }
        }

        return null;
    }

    public void setMapRegexpAndName(Map<String, String> mapRegexpAndName) {
        this.mapRegexpAndName = mapRegexpAndName;
    }
}
